在這個子系列課程,我們將學到:
TensorFlow是Google一開源、使用有向無環圖(Directed Acyclic Graph, DAG) 做高效速值計算的函式庫,它不只可以拿來做ML,還可以用來做任何使用GPU的數值運算。
那麼“TensorFlow”這個名字是怎麼來的呢?首先我們要先了解什麼是tensor。根據數值資料的維度,可以將其種類分為:
而flow代表著這些資料流進這個有向無環圖,這就是為什麼叫做“TensorFlow”。
但使用有向無環圖有什麼優點嗎?答案是有的,使用這樣的架構,就不會限制只能使用Python,你可以將模型訓練完後,轉換到C++上做快速低延遲(Latency)的預測,此外還可以在不同硬體間作轉換(如電腦到手機),所以可攜帶性(Portability)就是其最大的優點。
下圖是TensorFlow API 的階層,最底層是跟要執行TensorFlow硬體種類有關的,對於一般使用者大概都是使用最上面兩層。
那所謂惰性求值(Lazy Evaluation) 的意思是什麼呢?下面的圖就說明了這個概念:當程式執行到 c = tf.add(a,b)
的時候,並不會直接計算出變數c的值,而是先建立有向無環圖,建好後,計算的部分是在執行 session.run(c, feed_dict=...)
的部分。
雖然說TensorFlow預設是惰性求值,但是如果你需要除錯的話,也可以改成急切模式(Eager mode),下圖是一個例子。
TensorFlow使用有向無環圖,可以在建構圖的時候做分析,將可合併的計算合併,加快計算效率。
此外,在模型建構時,如果需要把計算圖視覺化的話,也可以使用TensorBoard工具,
下面是使用TensorBoard的例圖,我們將模型用 tf.summary.FileWriter()
寫出後,就可以在TensorBoard平台上面做模型視覺化:
前面簡單有講到Tensor和維度的關係,下表把它更清楚的列出來。
在TensorFlow,我們還可以將tensor做切分,類似numpy array一樣,也可以做 tf.reshape()
。
而模型在建構的時候,免不了要定義參數,下面是將w定義為 tf.get_variable()
的方式:
另外還有一種變數型態稱為 Placeholder,其概念就是定義完之後,不需要馬上賦予其值,等到執行後需要計算到它再給值便可。
這邊特別要了解的是 variable 和 placeholder 在概念上是不同的東西,最大的差異點就是在定義當下需不需要賦予其值。
今天介紹了TensorFlow 的核心元件,明天我們將透過實作來了解 “TensorFlow API如何運作”。